import pandas as pd
import os

# from bkcharts import Bar
from markupsafe import Markup
import numpy as np
from pyecharts.charts import Pie
from pyecharts import options as opts
# 使用snapshot-selenium 渲染图片
# from snapshot_selenium import snapshot
# 导入输出图片工具
# from pyecharts.render import make_snapshot

# 窗口
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
from tkinter import *

FILE_PATH = ''  # 需要检索的文件夹路径
LIST_TABLE_PATH = ''   # 名单表所在路径
# 名单表的标题，第一个属性为需要与文件名称匹配的数据，如需要对比学号，那么第一个元素就是学号，后面的为可选
TABLE_HEADER = ['学号', '姓名']
NEW_TITLE = '统计情况'     # 本次情况统计的标题
EXPORT_PATH = ''

root = tk.Tk()
var_new_title = tk.StringVar()

info = """
    1、本工具用于统计文件上交情况
    2、名单表要求：
        第一行为标题
        第一列为学号,第二列为姓名
        学号为后三位
    3、选择文件所在的文件夹，名单表及导出路径即可点击开始
    4、生成的表格默认名称为：统计情况.xlsx
    5、更多问题请联系QQ：1966447213

"""

def init():
    '''打开选择文件夹对话框'''
    root.title('文件上交情况统计')  # 添加窗体名称
    root.geometry('400x200')  # 设置窗体大小
    tip = Button(root, text="提示", command=tips,width=35).pack()

    choose_folder_btn = Button(root, text="请选择文件所在的文件夹", command=chooseFolder,width=35).pack()
    choose_excel_table_btn = Button(root, text="请选择名单表", command=chooseExcelTable,width=35).pack()
    select_export_btn = Button(root, text="请选择表格导出路径", command=select_export_path,width=35).pack()

    entry_new_title = tk.Entry(root, textvariable=var_new_title,w=30)
    tk.Label(root, text = '设置生成的Excel表格名称:').place(x=20,y=160) # 添加本组标题
    entry_new_title.place(x=170,y=160)
    Button(root, text="点击开始", command=check,width=35).pack()#添加第二个按钮
    root.resizable (False, False)
    # root.iconphoto(False, tk.PhotoImage(file='./icon.png'))
    root.mainloop()


def tips():
    message_worning(message = info)

def message_worning(title='提示', message='一些提醒'):
    top = tk.Tk()
    top.withdraw()  # 实现主窗口隐藏(即隐藏带tk标题的空白窗口)
    top.update()  # 需要update一下

    if title == '提示':
        tk.messagebox.showinfo(title=title, message=message)  # 不管如何点击提示框（确定/关闭），返回值都是“ok”
    elif title == '警告':
        tk.messagebox.showwarning(title=title, message=message)
    elif title == '错误':
        tk.messagebox.showerror(title=title, message=message)
    else:
        tk.messagebox.showwarning(title=title, message='没有输入正确的提示框title')

    top.destroy()  # 销毁控件，释放内存


# 开始检查
def check():
    global NEW_TITLE,var_new_title,EXPORT_PATH,LIST_TABLE_PATH
    if FILE_PATH == '':
        message_worning(message="请选择文件所在的文件夹！")
    elif LIST_TABLE_PATH == '':
        message_worning(message="请选择名单表！")
    elif EXPORT_PATH == '':
        message_worning(message="请选择导出路径！")
    else:
        new_title = var_new_title.get()
        if new_title != '':
            NEW_TITLE = new_title
        submission_status = get_submission_status(FILE_PATH, LIST_TABLE_PATH, TABLE_HEADER)
        pf = pd.DataFrame(list(submission_status))
        # generate_chart(pf)
        pf = pf.style.applymap(apply_colour)
        export_excel = EXPORT_PATH+'/' + NEW_TITLE + '.xlsx'
        pf.to_excel(export_excel, encoding='utf-8', index=False)
        message_worning(message="统计完成")
        print('...统计情况已生成Excel表【{}.xlsx】'.format(NEW_TITLE))


# 选择需要检索的文件夹
def chooseFolder():
    global FILE_PATH
    FILE_PATH = filedialog.askdirectory()


# 选择名单表
def chooseExcelTable():
    global LIST_TABLE_PATH
    LIST_TABLE_PATH = filedialog.askopenfilename()  # 获得选择好的文件


# 选择表格导出路径
def select_export_path():
    global EXPORT_PATH
    EXPORT_PATH = filedialog.askdirectory()

# 设置生成的表格名称
def SetTitle():
    NEW_TITLE = ''

# 获取文件夹中所有的文件名称
def get_files_name(file_path):
    filename_list = os.listdir(file_path)
    # print('获取到路径【{}】中的文件名称，一共{}个'.format(file_path,len(filename_list)))
    return filename_list


# 获取文件提交情况
def get_submission_status(file_path,list_table_path,table_header):
    filename_list = get_files_name(file_path)
    members_list = get_member_list(list_table_path,table_header)
    exist_total = 0
    for member in members_list:
        member[NEW_TITLE] = '未交'    # 初始化本次未交
        for filename in filename_list:
            if filename.find(str(member[table_header[0]])) != -1:
                member[NEW_TITLE] = '已交'   # 本次已交
                exist_total += 1
                break
        # if member[NEW_TITLE] == '未交':
        #     print("{}{}没有交".format(member[0],member[1]))
    #TODO 生成图表
    # make_bar(2, [exist_total,(len(members_list)-exist_total)])
    # print('检查结果：一共{}人，{}人已交，{}人未交'.format(len(members_list),exist_total,(len(members_list)-exist_total)))
    # for i in members_list:
    #     print(i,',')
    return members_list


# 从名单表中获取数据
def get_member_list(list_table_path,table_header):
    members = pd.read_excel(list_table_path)
    members_list = []
    members.fillna("", inplace=True)
    # 将名单表中的数据添加入字典中
    for i in members.index.values:
        members_line = members.loc[i,table_header]
        i = 0
        members_dict = {}
        while i != len(table_header):
            members_dict[table_header[i]] = members_line[i]
            i += 1
        members_list.append(members_line)
    # print('获取到路径【{}】中的名单，一共{}个'.format(list_table_path,len(members_list)))
    # generate_chart(NEW_TITLE,['已交','未交'],pd)
    return members_list

# TODO 添加扇形图
def pie():
   pass


# 设置字体颜色
def apply_colour(value):
    if value == '未交':
        colour = '#E53E31' #Blue
    elif  value == '已交':
        colour = '#32DD8F' #Green
    else:
        colour = '#393837' #Black

    return 'color: %s' % colour

def generate_chart(title, columns, data):
    # bar = Bar(NEW_TITLE, '按文件数统计')
    # x = np.array(data['姓名'])
    # y = np.array('已交')
    columns = ["已交","未交"]
    pie = Pie("饼状图", title, title_pos='center', width=900)
    #加入数据，设置坐标位置为【25，50】，上方的colums选项取消显示
    # pie.add("已交", columns, data[NEW_TITLE], center=[25, 50], is_legend_show=False)
    #加入数据，设置坐标位置为【75，50】，上方的colums选项取消显示，显示label标签
    pie.add(title, columns, data, center=[75, 50], is_legend_show=False, is_label_show=True)
    #保存图表
    pie.render()

#TODO 生成饼状图
def make_bar(x,y):
    #x = ['餐饮', '娱乐', '交通', '保养', '衣服']
    #y1 = [1000, 500, 100, 5000, 5000]
    #y2 = [2000, 1000, 100, 20, 30]
    bar = Bar()
    bar.add_xaxis(xaxis_data=x)
    # 第一个参数是图例的名称
    bar.add_yaxis(series_name='1', y_axis=y)
    #bar.add_yaxis(series_name='2', y_axis=y2)

    # 添加options
    bar.set_global_opts(title_opts=opts.TitleOpts(title='柱状图示例'))

    # 生成HTML文件保存在当前目录
    # 保存图片
    make_snapshot(snapshot, bar.render('datatest.html'), "datatest.png")

init()

# if __name__ == '__main__':
#     init()


